"""
用户账户相关的功能：注册、短信、登录、注销
"""
from django.shortcuts import render, HttpResponse  # 导入返回函数
from web.forms.account import RegisterModelForm, SendSmsForm  # 导入自建立的表单
from django.http import JsonResponse  # 用于发送json类型的数据
from web import models  # 对接数据库
import random  # 产生随机数
from utils.tencent.sms import send_sms_single  # 短信发送模块
from django_redis import get_redis_connection  # 创建redis数据库连接
from django.conf import settings  # 导入setting中的配置文件


# Create your views here.

# 注册
def register(request):
    if request.method == "GET":
        form = RegisterModelForm
        return render(request, 'register.html', {'form': form})

    else:
        # 将结果导入form表单中用于校验
        form = RegisterModelForm(data=request.POST)
        if form.is_valid():  # 校验成功
            # 校验通过写入数据库(密码要是密文)
            form.save()
            return JsonResponse({'status': True, 'data': '/login/'})

        else:  # 校验失败输出失败原因
            return JsonResponse({'status': False, 'error': form.errors})


# sms短信处理
def send_sms(request):
    # 获取初始数据
    phone = request.GET.get('mobilePhone')
    tpl = request.GET.get('tpl')
    template_id = settings.TENCENT_SMS_TEMPLATE.get(tpl)

    form = SendSmsForm(request, data=request.GET)

    # (因为表单错误，将部分功能放入view文件中)

    # 校验数据库中是否已有手机号
    # todo(lianglaing): 将上传的错误判别在html端显示
    exists = models.UserInfo.objects.filter(mobile_phone=phone).exists()
    if exists:
        return JsonResponse({"status": False, "phone": "该手机号已注册"})

    # 发短信 & 写入redis
    code = random.randrange(1000, 9999)
    send_sms_single('+86{}'.format(phone), template_id, [str(code), ])

    # 验证码写入redis(django-redis)
    conn = get_redis_connection()
    conn.set(phone, code, ex=60)

    # 校验手机号，不能为空和格式正确
    if form.is_valid():
        return JsonResponse({'status': True})

    return JsonResponse({'status': False, 'error': form.errors})
